/**
 * 2017年5月14日
 */
package util.io;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;

import org.apache.commons.io.IOUtils;
import org.apache.commons.io.LineIterator;

import pojo.weichatlab.Wechat;
import thirdpart.wechat.rmi.WechatContentFilter;
import util.docfilter.DocumentFilter;

/**
 * @author Alex
 *
 */
public class WechatUploadRegFilterIterator implements Iterator<String> {

	LineIterator li;
	List<DocumentFilter> filters = null;
	FileOutputStream fos = null;

	public WechatUploadRegFilterIterator(InputStream input, String encoding) {
		try {
			li = IOUtils.lineIterator(input, encoding);
			fos = new FileOutputStream(new File("E:\\DataSets\\textdata\\delete.txt"));
		} catch (IOException e) {
			e.printStackTrace();
			li = null;
			return;
		}
		// filters.add(e);
	}

	String tempLine = null;

	@Override
	public boolean hasNext() {
		if (li == null) {
			return false;
		}
		tempLine = null;
		while (tempLine == null && li.hasNext()) {
			// 去掉原文里面的。 。 \r \n 。等
			// 一行是一个微信文本
			tempLine = li.next();
			Wechat wechat = Wechat.stringtoWechat(tempLine);
			tempLine = wechat.getContent().replaceAll("[\\\\r\\\\n\\s]", "");
			wechat.setContent(tempLine);
			// 判断长度.或者是不是中英文
			if (!shouldGoOn(tempLine)) {
				try {
					IOUtils.write("长度and中英文 "+wechat.fulltoString() + "\r\n", fos);
				} catch (IOException e) {
					e.printStackTrace();
				}
				tempLine = null;
				continue;
			}
			// 正则过滤
			String[] pre = preprocessLine(tempLine);
			tempLine = pre[0];
			// 判断长度.
			if (!keep(tempLine)) {
				try {
					IOUtils.write("正则过滤 "+wechat.fulltoString()+ "\t" + pre[1] + "\r\n", fos);
				} catch (IOException e) {
					e.printStackTrace();
				}
				tempLine = null;
				continue;
			}
			if (tempLine != null)
				tempLine = wechat.fulltoString() + "\r\n";

		}
		return tempLine != null;

	}

	@Override
	public String next() {
		return tempLine;
	}

	// 长度判断
	private boolean keep(String s) {
		/*
		 * for (DocumentFilter df : filters) { if (!df.shouldKeep(s)) return
		 * false; }
		 */
		if (s.length() > 15)
			return true;
		else
			return false;
	}

	// [0]是过滤之后剩下的 [1]是被过滤的内容.
	private static String[] preprocessLine(String s) {
		return new WechatContentFilter().filterNoise(s);
	}

	// 长度判断 语种判断
	private boolean shouldGoOn(String strName) {
		if(strName.length() < 25)
			return false;
		int validLen = 0;
		for (int i = 0; i < strName.length(); i++) {
			if (isEnglish(strName.charAt(i)) || isChinese(strName.charAt(i)))
				validLen++;
		}
		if (validLen * 1.0 / strName.length() > 0.35)
			return true;
		else
			return false;
	}

	// 根据Unicode编码完美的判断中文汉字
	private boolean isChinese(char c) {
		Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
		if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
				|| ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
				|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
				|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B) {
			return true;
		}
		return false;
	}

	// 是否是英文
	private boolean isEnglish(char c) {
		return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
	}

	/*private boolean isEnPunctuationAndNum(char ch) {
		if (0x21 <= ch && ch <= 0x40)
			return true;
		if (0x5B <= ch && ch <= 0x60)
			return true;
		if (0x7B <= ch && ch <= 0x7E)
			return true;

		return false;
	}

	private boolean isChinesePunctuation(char c) {
		Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
		if (ub == Character.UnicodeBlock.GENERAL_PUNCTUATION
				|| ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
				|| ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS
				|| ub == Character.UnicodeBlock.CJK_COMPATIBILITY_FORMS
				|| ub == Character.UnicodeBlock.VERTICAL_FORMS) {
			return true;
		} else {
			return false;
		}
	}*/

	/*public static void main(String[] args) {
		String str = "PRO5原定于10月12日开售但之前传闻说，由于受台风“彩虹”影响，位于湛江的魅族手机包装供应商仓库被淹，预计将延迟发货半个月到一个月针对传闻，魅族发布公告称，我们没输给台风，输给了自己“是我们自己的原因，PRO5的NFC功能还不够完美，需要调试以及合入最新固件”本文来源：中国经营报近日，魅族发布公告称，PRO5将延迟6天发货，但并非是受台风影响，而是由于NFC功能还不够完美，需要调试以及合入最新固件据了解，PRO5是魅族定位高端的产品上月底，魅族宣布推出高端子品牌PRO，并正式发布了该系列的第一款机型PRO5至此，魅族的产品线布局大致完成，PRO、MX和魅蓝系列分别覆盖高中低不同的市场区间如今，到了临发货之前才提出需要重新调试，延迟发货，外界关注的是，这是一种饥饿营销还是对产品品质的追求？同时，延迟发货是否会对接下来的销量造成影响？延迟发货销量承压PRO5原定于10月12日开售但之前传闻说，由于受台风“彩虹”影响，位于湛江的魅族手机包装供应商仓库被淹，预计将延迟发货半个月到一个月针对传闻，魅族发布公告称，我们没输给台风，输给了自己“是我们自己的原因，PRO5的NFC功能还不够完美，需要调试以及合入最新固件”所谓NFC，即近场通信技术，拥有NFC功能除了方便与蓝牙设备间的配对之外，NFC还支持移动支付、门禁识别、数据传输、信息浏览等早在十余年前，NFC功能便在日韩等邻国大量应用于手持终端2013年，中国移动曾与北京公交总公司合作推出NFC手机，以刷手机代替公交卡，以期减少出行携带物不过，该技术在中国一直未能普及起来，主要与成本有关据了解，要加入NFC功能，除了上游芯片供应商之外，手机制造商要同时整合银联、商户和手机消费者的多重协作，产业链过长，从而导致成本增加毕竟随着手机行业竞争日趋激烈，价格一再被压低，成本的增加已成为不可承受之重另一方面则是安全隐患的问题业内人士指出，安卓用户使用NFC支付，需要用户换卡、换手机，在换卡换机的过程当中，用户要承受可能存在的隐私泄漏风险，机卡内的各种信息随时能被拷走，用户心存顾虑此外，NFC技术需要信号发送端和接收端同时使用，且只能近距离操作才能实现支付，对环境、时间、物理距离、操作姿势都有要求其他主流支付方式则无此限制，如扫描二维码，手机上只要有摄像头和扫码应用，无论二维码印刷在何介质上均可有效读取从眼下国内市场来看，跟进这一应用的厂商不多，以中低端市场为主的中国手机厂商，近两年在旗舰产品上尝试加入NFC支付技术对于延迟发货对销量所造成的影响等问题，截至《中国经营报》记者发稿前，魅族尚未作出回复而通信行业观察家项立刚认为，“推迟6天的时间消费者应该还能接受，对魅族的损失不会那么严重倒是现在发现一些问题，提出来需要重新调整，没有正常发货，可能还会引起一些关注，在某种程度上来说，算是一种营销手段”为表示歉意，魅族称将对这批即将购买PRO5的3万名消费者提供总额近千万元的补偿：所有用户赠送价值￥199的一年PRO5意外保；32G用户额外赠送价值￥129的EP-21HD耳机；64G用户额外赠送价值￥129的Flyme消费券产量不足被迫饥饿营销？事实上，在此之前，魅族宣布进军印度市场，并在印度发布了智能手机魅族MX5而这款手机在国内持续处于缺货，甚至加价才能买到的状态于是，有业内人士质疑，魅族是否在玩饥饿营销项立刚表示，“不认为手机厂商会故意搞饥饿营销最早的时候，大家都说苹果搞饥饿营销，后来大家又说小米饥饿营销，根本原因在于产量不足，没有做到这个数字”按照其说法，任何一个手机厂商做手机时，又不敢明确说这款手机能卖多少，只能在原来的销售基础上，做一个比较保守的数据，因为如果做得不好，手机厂商都会死在库存上比如预测卖100万部，如果实际做了80万部，全部卖掉就能赚钱；但如果做了150万部，只卖掉120万部，可能会死掉过去，魅族崇尚“小而美”的理念自2014年创始人黄章回归以来，魅族开始走上激进的扩张之路，向大公司转型仔细算下来，自今年6月以来，魅族至少要开5场发布会，到10月为止，恰好是平均每月一场的节奏，而且每场都请来大牌明星助阵如今PRO5才正要发货，魅蓝的新品又来了对于魅族而言，在供应链和产品的消化上是否会有压力？“做多款产品，覆盖多个人群，这件事情不止魅族在做，比如以前诺基亚一年发30个品种，平均一个月发三款手机，甚至一年50个品种，所以说机海战术和精品战术都是一个公司的策略中兴、华为过去是采用机海战术的，现在转而采用精品战术，希望提高利润；魅族过去是采用精品战术的，现在转而采用机海战术，希望把销量做起来，不同的时期有不同的选择”项立刚表示-Ed-2015最火微信榜单(推荐)黄湘子微信号：huagxiagzi666（←长按复制）湘子以作者的视角和建筑师的眼光，在这个信息爆炸的时代，为你精挑细选出，深刻、独到、有趣、有态度的文章和最新的世界设计信息让你从今天开始，与众不同！您可以扫描以下二维码关注我！	20151018	主编QQ：1064224463，欢迎投稿，期待各位盆友找我讨论人生魅族PRO5核心提示：PRO5原定于10月12日开售但之前传闻说，由于受台风“彩虹”影响，位于湛江的魅族手机包装供应商仓库被淹，预计将延迟发货半个月到一个月针对传闻，魅族发布公告称，我们没输给台风，输给了自己“是我们自己的原因，PRO5的NFC功能还不够完美，需要调试以及合入最新固件”本文来源：中国经营报近日，魅族发布公告称，PRO5将延迟6天发货，但并非是受台风影响，而是由于NFC功能还不够完美，需要调试以及合入最新固件据了解，PRO5是魅族定位高端的产品上月底，魅族宣布推出高端子品牌PRO，并正式发布了该系列的第一款机型PRO5至此，魅族的产品线布局大致完成，PRO、MX和魅蓝系列分别覆盖高中低不同的市场区间如今，到了临发货之前才提出需要重新调试，延迟发货，外界关注的是，这是一种饥饿营销还是对产品品质的追求？同时，延迟发货是否会对接下来的销量造成影响？延迟发货销量承压PRO5原定于10月12日开售但之前传闻说，由于受台风“彩虹”影响，位于湛江的魅族手机包装供应商仓库被淹，预计将延迟发货半个月到一个月针对传闻，魅族发布公告称，我们没输给台风，输给了自己“是我们自己的原因，PRO5的NFC功能还不够完美，需要调试以及合入最新固件”所谓NFC，即近场通信技术，拥有NFC功能除了方便与蓝牙设备间的配对之外，NFC还支持移动支付、门禁识别、数据传输、信息浏览等早在十余年前，NFC功能便在日韩等邻国大量应用于手持终端2013年，中国移动曾与北京公交总公司合作推出NFC手机，以刷手机代替公交卡，以期减少出行携带物不过，该技术在中国一直未能普及起来，主要与成本有关据了解，要加入NFC功能，除了上游芯片供应商之外，手机制造商要同时整合银联、商户和手机消费者的多重协作，产业链过长，从而导致成本增加毕竟随着手机行业竞争日趋激烈，价格一再被压低，成本的增加已成为不可承受之重另一方面则是安全隐患的问题业内人士指出，安卓用户使用NFC支付，需要用户换卡、换手机，在换卡换机的过程当中，用户要承受可能存在的隐私泄漏风险，机卡内的各种信息随时能被拷走，用户心存顾虑此外，NFC技术需要信号发送端和接收端同时使用，且只能近距离操作才能实现支付，对环境、时间、物理距离、操作姿势都有要求其他主流支付方式则无此限制，如扫描二维码，手机上只要有摄像头和扫码应用，无论二维码印刷在何介质上均可有效读取从眼下国内市场来看，跟进这一应用的厂商不多，以中低端市场为主的中国手机厂商，近两年在旗舰产品上尝试加入NFC支付技术对于延迟发货对销量所造成的影响等问题，截至《中国经营报》记者发稿前，魅族尚未作出回复而通信行业观察家项立刚认为，“推迟6天的时间消费者应该还能接受，对魅族的损失不会那么严重倒是现在发现一些问题，提出来需要重新调整，没有正常发货，可能还会引起一些关注，在某种程度上来说，算是一种营销手段”为表示歉意，魅族称将对这批即将购买PRO5的3万名消费者提供总额近千万元的补偿：所有用户赠送价值￥199的一年PRO5意外保；32G用户额外赠送价值￥129的EP-21HD耳机；64G用户额外赠送价值￥129的Flyme消费券产量不足被迫饥饿营销？事实上，在此之前，魅族宣布进军印度市场，并在印度发布了智能手机魅族MX5而这款手机在国内持续处于缺货，甚至加价才能买到的状态于是，有业内人士质疑，魅族是否在玩饥饿营销项立刚表示，“不认为手机厂商会故意搞饥饿营销最早的时候，大家都说苹果搞饥饿营销，后来大家又说小米饥饿营销，根本原因在于产量不足，没有做到这个数字”按照其说法，任何一个手机厂商做手机时，又不敢明确说这款手机能卖多少，只能在原来的销售基础上，做一个比较保守的数据，因为如果做得不好，手机厂商都会死在库存上比如预测卖100万部，如果实际做了80万部，全部卖掉就能赚钱；但如果做了150万部，只卖掉120万部，可能会死掉过去，魅族崇尚“小而美”的理念自2014年创始人黄章回归以来，魅族开始走上激进的扩张之路，向大公司转型仔细算下来，自今年6月以来，魅族至少要开5场发布会，到10月为止，恰好是平均每月一场的节奏，而且每场都请来大牌明星助阵如今PRO5才正要发货，魅蓝的新品又来了对于魅族而言，在供应链和产品的消化上是否会有压力？“做多款产品，覆盖多个人群，这件事情不止魅族在做，比如以前诺基亚一年发30个品种，平均一个月发三款手机，甚至一年50个品种，所以说机海战术和精品战术都是一个公司的策略中兴、华为过去是采用机海战术的，现在转而采用精品战术，希望提高利润；魅族过去是采用精品战术的，现在转而采用机海战术，希望把销量做起来，不同的时期有不同的选择”项立刚表示-Ed-2015最火微信榜单(推荐)黄湘子微信号：huagxiagzi666（←长按复制）湘子以作者的视角和建筑师的眼光，在这个信息爆炸的时代，为你精挑细选出，深刻、独到、有趣、有态度的文章和最新的世界设计信息让你从今天开始，与众不同！您可以扫描以下二维码关注我！";
		String[] s = preprocessLine(str);
		System.out.println("valid:"+s[0]);
		System.out.println("delete:"+s[1]);
	}*/

}
